home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.hypersurf.com
/
ftp.hypersurf.com.tar
/
ftp.hypersurf.com
/
pub
/
mac
/
ftp
/
Fetch_3.0.3.hqx
/
Fetch 3.0.3 Installer
/
FetchAE.cp
< prev
next >
Wrap
Text File
|
1996-12-30
|
25KB
|
936 lines
/*
FetchAE.cp -- sample Apple Event code for Fetch
Copyright ⌐ 1996, Trustees of Dartmouth College
All Rights Reserved.
Distribution and use of this code is hereby permitted, provided that any resulting
work includes the copyright statement above.
*/
#include <string.h>
#include <AEObjects.h>
#include <AEPackObject.h>
#include "FetchAE.h"
static void InitDesc(AEDesc *desc);
static void DisposeDesc(AEDesc *desc);
static void CStringToDesc(char *valuep, DescType dType, AEDesc *desc);
static void DescTypeToDesc(OSType value, DescType dType, AEDesc *desc);
static void LongToDesc(long value, DescType dType, AEDesc *desc);
static void FSSpecToDesc(FSSpec *valuep, DescType dType, AEDesc *desc);
static Boolean findProcessBySignature(OSType sig, ProcessSerialNumber *psn_p, long *proc_mode_p);
static Boolean findAppBySignature(OSType sig, FSSpec *fspec_p);
static OSErr InitAEToApp(OSType appSig, AEEventClass eventClass, AEEventID eventID,
AppleEvent *aevt, Boolean *running);
static OSErr SendAEToApp(OSType appSig, AppleEvent *aevt, AppleEvent *aereply, AEIdleUPP idleUPP, Boolean running);
static OSErr SendDirectAppleEvent(OSType appSig, AEEventClass eventClass, AEEventID eventID,
AEDesc *directDesc, AppleEvent *aereply, AEIdleUPP idleUPP);
static OSErr SendDirectAppleEventWithArg(OSType appSig, AEEventClass eventClass, AEEventID eventID,
AEDesc *directDesc, AEKeyword argKey, AEDesc *argDesc,
AppleEvent *aereply, AEIdleUPP idleUPP);
static OSErr SendDirectAppleEventWithThreeArgs(OSType appSig, AEEventClass eventClass, AEEventID eventID,
AEDesc *directDesc, AEKeyword argKey, AEDesc *argDesc,
AEKeyword arg2Key, AEDesc *arg2Desc,
AEKeyword arg3Key, AEDesc *arg3Desc,
AppleEvent *aereply, AEIdleUPP idleUPP);
static OSErr SendCreateAppleEvent(OSType appSig, DescType objClass, AEDesc *insertLocDesc,
AEDesc *dataDesc, AEDesc *propDesc,
AppleEvent *aereply, AEIdleUPP idleUPP);
static OSErr SendMoveCloneAppleEvent(OSType appSig, AEEventID eventID, AEDesc *directDesc,
AEDesc *insertLocDesc, AppleEvent *aereply, AEIdleUPP idleUPP);
static OSErr CreateFormNameOSpec(char *name, DescType objClass, AEDesc *containerDesc, AEDesc *ospecDesc);
static OSErr CreatePropertyOSpec(DescType propCode, AEDesc *containerDesc, AEDesc *ospecDesc);
/*
* InitDesc() --
* Initialize a descriptor.
*/
void InitDesc(AEDesc *desc)
{
desc->descriptorType = typeNull;
desc->dataHandle = nil;
}
/*
* DisposeDesc() --
* Dispose of descriptor data and mark descriptor as empty.
*/
void DisposeDesc(AEDesc *desc)
{
if (desc->dataHandle != nil)
(void) AEDisposeDesc(desc);
InitDesc(desc);
}
/*
* CStringToDesc() --
* Put a C string into a descriptor record.
*/
void CStringToDesc(char *valuep, DescType dType, AEDesc *desc)
{
desc->descriptorType = dType;
if (dType == typeChar)
(void) PtrToHand(valuep, &desc->dataHandle, strlen(valuep));
else if (dType == typeIntlText)
{
desc->dataHandle = NewHandle(4+valuep[0]);
*(short *) *desc->dataHandle = smRoman;
*(short *) (*desc->dataHandle + 2) = langEnglish;
BlockMoveData(valuep, *desc->dataHandle + 4, strlen(valuep));
}
else
InitDesc(desc);
} /* CStringToDesc() */
/*
* DescTypeToDesc() --
* Put an OSType into a descriptor record.
*/
void DescTypeToDesc(OSType value, DescType dType, AEDesc *desc)
{
desc->descriptorType = dType;
(void) PtrToHand(&value, &desc->dataHandle, sizeof(value));
} /* DescTypeToDesc() */
/*
* LongToDesc() --
* Put a longint into a descriptor record.
*/
void LongToDesc(long value, DescType dType, AEDesc *desc)
{
desc->descriptorType = dType;
if (dType == typeLongDateTime)
{
desc->dataHandle = NewHandle(8);
*(long *) *desc->dataHandle = 0;
*(long *) (*desc->dataHandle + 4) = value;
}
else
(void) PtrToHand(&value, &desc->dataHandle, sizeof(value));
} /* LongToDesc() */
/*
* FSSpecToDesc() --
* Put a File System Spec into a descriptor record.
*/
void FSSpecToDesc(FSSpec *valuep, DescType dType, AEDesc *desc)
{
OSErr osstat;
desc->descriptorType = dType;
if (dType == typeFSS)
(void) PtrToHand(valuep, &desc->dataHandle, sizeof(FSSpec));
else if (dType == typeAlias)
{
osstat = NewAlias(nil, valuep, (AliasHandle *) &desc->dataHandle);
if (osstat != noErr)
InitDesc(desc);
}
else
InitDesc(desc);
} /* FSSpecToDesc() */
/*
* findProcessBySignature() --
* Find a running process based on its signature
* See IM-VI 29-11
*/
Boolean findProcessBySignature(OSType sig, ProcessSerialNumber *psn_p, long *proc_mode_p)
{
ProcessInfoRec procInfo;
psn_p->highLongOfPSN = 0;
psn_p->lowLongOfPSN = kNoProcess;
procInfo.processInfoLength = sizeof(procInfo);
procInfo.processName = NULL;
procInfo.processAppSpec = NULL;
while (GetNextProcess(psn_p) == noErr)
if (GetProcessInformation(psn_p, &procInfo) == noErr)
if ((procInfo.processType == 'APPL') &&
(procInfo.processSignature == sig))
{
*proc_mode_p = procInfo.processMode;
return true;
}
return false;
} /* findProcessBySignature() */
/*
* findAppBySignature() --
* Use the desktop database to find an app with this sig on a mounted volume.
*/
Boolean findAppBySignature(OSType sig, FSSpec *fspec_p)
{
ParamBlockRec pb;
HParamBlockRec hpb;
GetVolParmsInfoBuffer volParms;
DTPBRec dtpb;
OSErr osstat;
/* for each volume */
pb.volumeParam.ioCompletion = NULL;
pb.volumeParam.ioNamePtr = NULL;
pb.volumeParam.ioVRefNum = 0;
pb.volumeParam.ioVolIndex = 1;
osstat = PBGetVInfo(&pb, false);
while (osstat == noErr)
{
/* check to see if it supports the desktop manager */
hpb.ioParam.ioCompletion = NULL;
hpb.ioParam.ioVRefNum = pb.volumeParam.ioVRefNum;
hpb.ioParam.ioNamePtr = NULL;
hpb.ioParam.ioBuffer = (Ptr) &volParms;
hpb.ioParam.ioReqCount = sizeof(volParms);
osstat = PBHGetVolParms(&hpb, false);
if ((osstat == noErr) && (volParms.vMAttrib & (1 << bHasDesktopMgr)))
{
/* find out the Desktop reference number */
dtpb.ioNamePtr = NULL;
dtpb.ioVRefNum = pb.volumeParam.ioVRefNum;
osstat = PBDTGetPath(&dtpb);
if (osstat == noErr)
{
/* search this Desktop database for an app with the right signature */
dtpb.ioCompletion = NULL;
dtpb.ioNamePtr = (StringPtr) &(fspec_p->name);
dtpb.ioIndex = 0;
dtpb.ioFileCreator = sig;
osstat = PBDTGetAPPL(&dtpb, false);
if (osstat == noErr)
{
/* found the app */
fspec_p->vRefNum = pb.volumeParam.ioVRefNum;
fspec_p->parID = dtpb.ioAPPLParID;
return true;
} /* PBDTGetAPPL == noErr */
} /* PBDTGetPath == noErr */
} /* PBHGetVolParms == noErr */
pb.volumeParam.ioVolIndex++;
osstat = PBGetVInfo(&pb, false);
} /* while PBGetVInfo == noErr */
return false;
} /* findAppBySignature() */
/*
* InitAEToApp() --
* Initialize an apple event to be sent to an application. Return the event, and
* whether the application is currently running.
*/
OSErr InitAEToApp(OSType appSig, AEEventClass eventClass, AEEventID eventID,
AppleEvent *aevt, Boolean *running)
{
AEDesc addrDesc;
ProcessSerialNumber psn;
long dummy;
OSErr osstat;
InitDesc(&addrDesc);
osstat = noErr;
*running = findProcessBySignature(appSig, &psn, &dummy);
if (*running)
osstat = AECreateDesc(typeProcessSerialNumber, &psn, sizeof(psn), &addrDesc);
else
osstat = AECreateDesc(typeApplSignature, &appSig, sizeof(OSType), &addrDesc);
if (osstat != noErr)
goto exit;
osstat = AECreateAppleEvent(eventClass, eventID, &addrDesc,
kAutoGenerateReturnID, kAnyTransactionID,
aevt);
exit:
DisposeDesc(&addrDesc);
return osstat;
} /* InitAEToApp() */
/*
* SendAEToApp() --
* Send an Apple Event to an application, which may or may not be running. If it isn't
* running, the event reply won't be filled in....
*/
OSErr SendAEToApp(OSType appSig, AppleEvent *aevt, AppleEvent *aereply, AEIdleUPP idleUPP, Boolean running)
{
LaunchParamBlockRec lpb;
AEDesc appParmDesc;
AEDesc replyDesc;
AppleEvent myreply;
AppleEvent *replyp;
FSSpec appFspec;
OSErr osstat = noErr;
InitDesc(&appParmDesc);
InitDesc(&myreply);
InitDesc(&replyDesc);
if (running)
{
/* the app is running, just send the event */
replyp = aereply ? aereply : &myreply;
osstat = AESend(aevt, replyp, kAEWaitReply + kAECanInteract + kAECanSwitchLayer + kAEDontReconnect,
kAENormalPriority, kAEDefaultTimeout, idleUPP, nil);
if (osstat == -603)
/* ignore this error, it doesn't seem to matter */
osstat = noErr;
if (osstat == noErr)
{
osstat = AEGetParamDesc(replyp, keyErrorNumber, typeLongInteger, &replyDesc);
if (osstat == noErr)
osstat = **(long **) replyDesc.dataHandle;
else if (osstat == errAEDescNotFound)
/* no error code, no error */
osstat = noErr;
}
} // running
else if (findAppBySignature(appSig, &appFspec))
{
/* we need to launch the app with the event */
osstat = AECoerceDesc(aevt, typeAppParameters, &appParmDesc);
if (osstat != noErr)
goto exit;
HLock(appParmDesc.dataHandle);
/* call LaunchApplication */
lpb.launchBlockID = extendedBlock;
lpb.launchEPBLength = extendedBlockLen;
lpb.launchFileFlags = launchNoFileFlags;
lpb.launchControlFlags = launchContinue + launchDontSwitch;
lpb.launchAppSpec = &appFspec;
lpb.launchAppParameters = (AppParametersPtr) *appParmDesc.dataHandle;
THz oldZone = GetZone();
osstat = LaunchApplication(&lpb);
if (osstat == -603)
/* ignore this error, it doesn't seem to matter */
osstat = noErr;
SetZone(oldZone);
} // findAppBySignature()
else
/* app can't be found */
osstat = fnfErr;
exit:
DisposeDesc(&appParmDesc);
DisposeDesc(&myreply);
DisposeDesc(&replyDesc);
return osstat;
} /* SendAEToApp() */
/*
* SendDirectAppleEvent() --
* Send a simple event w/ just a direct parameter.
*/
OSErr SendDirectAppleEvent(OSType appSig, AEEventClass eventClass, AEEventID eventID,
AEDesc *directDesc, AppleEvent *aereply, AEIdleUPP idleUPP)
{
AppleEvent aevt;
OSErr osstat;
Boolean running;
InitDesc(&aevt);
osstat = noErr;
/* create the event */
osstat = InitAEToApp(appSig, eventClass, eventID, &aevt, &running);
if (osstat != noErr)
goto exit;
/* add direct object */
osstat = AEPutParamDesc(&aevt, keyDirectObject, directDesc);
if (osstat != noErr)
goto exit;
/* send the event */
osstat = SendAEToApp(appSig, &aevt, aereply, idleUPP, running);
exit:
DisposeDesc(&aevt);
return osstat;
} /* SendDirectAppleEvent */
/*
* SendDirectAppleEventWithArg() --
* Send a simple event w/ a direct parameter and one other argument.
*/
OSErr SendDirectAppleEventWithArg(OSType appSig, AEEventClass eventClass, AEEventID eventID,
AEDesc *directDesc, AEKeyword argKey, AEDesc *argDesc,
AppleEvent *aereply, AEIdleUPP idleUPP)
{
AppleEvent aevt;
OSErr osstat;
Boolean running;
InitDesc(&aevt);
osstat = noErr;
/* create the event */
osstat = InitAEToApp(appSig, eventClass, eventID, &aevt, &running);
if (osstat != noErr)
goto exit;
/* add direct object */
osstat = AEPutParamDesc(&aevt, keyDirectObject, directDesc);
if (osstat != noErr)
goto exit;
/* add argument */
osstat = AEPutParamDesc(&aevt, argKey, argDesc);
if (osstat != noErr)
goto exit;
/* send the event */
osstat = SendAEToApp(appSig, &aevt, aereply, idleUPP, running);
exit:
DisposeDesc(&aevt);
return osstat;
} /* SendDirectAppleEventWithArg */
/*
* SendDirectAppleEventWithThreeArgs() --
* Send ourselves an event w/ a direct parameter and three other arguments.
*/
OSErr SendDirectAppleEventWithThreeArgs(OSType appSig, AEEventClass eventClass, AEEventID eventID,
AEDesc *directDesc, AEKeyword argKey, AEDesc *argDesc,
AEKeyword arg2Key, AEDesc *arg2Desc,
AEKeyword arg3Key, AEDesc *arg3Desc,
AppleEvent *aereply, AEIdleUPP idleUPP)
{
AppleEvent aevt;
OSErr osstat;
Boolean running;
InitDesc(&aevt);
osstat = noErr;
/* create the event */
osstat = InitAEToApp(appSig, eventClass, eventID, &aevt, &running);
if (osstat != noErr)
goto exit;
/* add direct object */
osstat = AEPutParamDesc(&aevt, keyDirectObject, directDesc);
if (osstat != noErr)
goto exit;
/* add arguments */
osstat = AEPutParamDesc(&aevt, argKey, argDesc);
if (osstat != noErr)
goto exit;
osstat = AEPutParamDesc(&aevt, arg2Key, arg2Desc);
if (osstat != noErr)
goto exit;
osstat = AEPutParamDesc(&aevt, arg3Key, arg3Desc);
if (osstat != noErr)
goto exit;
/* send the event */
osstat = SendAEToApp(appSig, &aevt, aereply, idleUPP, running);
exit:
DisposeDesc(&aevt);
return osstat;
} /* SendDirectAppleEventWithThreeArgs */
/*
* SendCreateAppleEvent() --
* Send a Create Element event.
*/
OSErr SendCreateAppleEvent(OSType appSig, DescType objClass, AEDesc *insertLocDesc,
AEDesc *dataDesc, AEDesc *propDesc,
AppleEvent *aereply, AEIdleUPP idleUPP)
{
AppleEvent aevt;
OSErr osstat;
Boolean running;
InitDesc(&aevt);
osstat = noErr;
/* create the event */
osstat = InitAEToApp(appSig, kAECoreSuite, kAECreateElement, &aevt, &running);
if (osstat != noErr)
goto exit;
/* add desired class */
osstat = AEPutParamPtr(&aevt, keyAEObjectClass, typeType, &objClass,
sizeof(objClass));
if (osstat != noErr)
goto exit;
/* add insertion location */
osstat = AEPutParamDesc(&aevt, keyAEInsertHere, insertLocDesc);
if (osstat != noErr)
goto exit;
/* add initial data, if (there is some */
if (dataDesc && (dataDesc->descriptorType != typeNull))
{
osstat = AEPutParamDesc(&aevt, keyAEData, dataDesc);
if (osstat != noErr)
goto exit;
}
/* add initial property values, if (there are some */
if (propDesc && (propDesc->descriptorType != typeNull))
{
osstat = AEPutParamDesc(&aevt, keyAEPropData, propDesc);
if (osstat != noErr)
goto exit;
}
/* send the event */
osstat = SendAEToApp(appSig, &aevt, aereply, idleUPP, running);
exit:
DisposeDesc(&aevt);
return osstat;
} /* SendCreateAppleEvent() */
/*
* SendMoveCloneAppleEvent() --
* Send a Move or Clone event.
*/
OSErr SendMoveCloneAppleEvent(OSType appSig, AEEventID eventID, AEDesc *directDesc,
AEDesc *insertLocDesc, AppleEvent *aereply, AEIdleUPP idleUPP)
{
AppleEvent aevt;
OSErr osstat;
Boolean running;
InitDesc(&aevt);
osstat = noErr;
/* create the event */
osstat = InitAEToApp(appSig, kAECoreSuite, eventID, &aevt, &running);
if (osstat != noErr)
goto exit;
/* add direct object */
osstat = AEPutParamDesc(&aevt, keyDirectObject, directDesc);
if (osstat != noErr)
goto exit;
/* add insertion location */
osstat = AEPutParamDesc(&aevt, keyAEInsertHere, insertLocDesc);
if (osstat != noErr)
goto exit;
/* send the event */
osstat = SendAEToApp(appSig, &aevt, aereply, idleUPP, running);
exit:
DisposeDesc(&aevt);
return osstat;
} /* SendMoveCloneAppleEvent() */
/*
* CreateFormNameOSpec() --
* Create a formName object specifier.
*/
OSErr CreateFormNameOSpec(char *name, DescType objClass, AEDesc *containerDesc, AEDesc *ospecDesc)
{
AEDesc keyDesc;
AEDesc nullDesc;
InitDesc(&keyDesc);
InitDesc(&nullDesc);
CStringToDesc(name, typeChar, &keyDesc);
OSErr osstat = CreateObjSpecifier(objClass, containerDesc ? containerDesc : &nullDesc,
formName, &keyDesc, false, ospecDesc);
DisposeDesc(&keyDesc);
return osstat;
} // CreateFormNameOSpec()
/*
* CreatePropertyOSpec() --
* Create a formPropertyID object specifier.
*/
OSErr CreatePropertyOSpec(DescType propCode, AEDesc *containerDesc, AEDesc *ospecDesc)
{
AEDesc keyDesc;
AEDesc nullDesc;
InitDesc(&keyDesc);
InitDesc(&nullDesc);
DescTypeToDesc(propCode, typeType, &keyDesc);
OSErr osstat = CreateObjSpecifier(cProperty, containerDesc ? containerDesc : &nullDesc,
formPropertyID, &keyDesc, false, ospecDesc);
DisposeDesc(&keyDesc);
return osstat;
} // CreatePropertyOSpec()
/*
* FetchOpenURL() --
* Tell Fetch to open a directory (specified by a URL).
*/
OSErr FetchOpenURL(char *url, AEIdleUPP idleUPP)
{
AEDesc urlDesc;
OSErr osstat = noErr;
InitDesc(&urlDesc);
osstat = CreateFormNameOSpec(url, cURL, nil, &urlDesc);
if (osstat == noErr)
osstat = SendDirectAppleEvent(FETCH_APP_SIGNATURE, kCoreEventClass, kAEOpen, &urlDesc,
nil, idleUPP);
DisposeDesc(&urlDesc);
return osstat;
} // FetchOpenURL()
/*
* FetchPut() --
* Tell Fetch to upload a file or folder to a URL
*/
OSErr FetchPut(FSSpec *fspec, char *url, AEIdleUPP idleUPP)
{
AEDesc urlDesc;
AEDesc fspecDesc;
OSErr osstat = noErr;
InitDesc(&urlDesc);
InitDesc(&fspecDesc);
osstat = CreateFormNameOSpec(url, cURL, nil, &urlDesc);
if (osstat != noErr)
goto exit;
FSSpecToDesc(fspec, typeAlias, &fspecDesc);
osstat = SendDirectAppleEventWithArg(FETCH_APP_SIGNATURE, kAEFetchSuite, kAEPutIntoEvent,
&urlDesc,
kAEFetchPutIntoItemsParam, &fspecDesc,
nil, idleUPP);
exit:
DisposeDesc(&urlDesc);
DisposeDesc(&fspecDesc);
return osstat;
} // FetchPut()
/*
* FetchGet() --
* Tell Fetch to download a file or folder from a URL to a folder
*/
OSErr FetchGet(char *url, FSSpec *fspec, AEIdleUPP idleUPP)
{
AEDesc nullDesc;
AEDesc aerDesc;
AEDesc insertLocDesc;
AEDesc fspecDesc;
AEDesc urlDesc;
DescType positionCode;
OSErr osstat;
InitDesc(&nullDesc);
InitDesc(&aerDesc);
InitDesc(&insertLocDesc);
InitDesc(&fspecDesc);
InitDesc(&urlDesc);
osstat = noErr;
/* first get Ospec for target folder */
FSSpecToDesc(fspec, typeAlias, &fspecDesc);
/* next build insertion location ("Beginning of alias foo") */
osstat = AECreateList(nil, 0, true, &aerDesc);
if (osstat != noErr)
goto exit;
/* add object-in-relation-to field */
osstat = AEPutKeyDesc(&aerDesc, keyAEObject, &fspecDesc);
if (osstat != noErr)
goto exit;
/* add positioning field */
positionCode = kAEBeginning;
osstat = AEPutKeyPtr(&aerDesc, keyAEPosition, typeEnumerated, &positionCode,
sizeof(positionCode));
if (osstat != noErr)
goto exit;
/* coerce to typeInsertionLoc */
osstat = AECoerceDesc(&aerDesc, typeInsertionLoc, &insertLocDesc);
if (osstat != noErr)
goto exit;
/* create Ospec for item to get */
osstat = CreateFormNameOSpec(url, cURL, nil, &urlDesc);
if (osstat != noErr)
goto exit;
/* now send the event */
osstat = SendMoveCloneAppleEvent(FETCH_APP_SIGNATURE, kAEClone, &urlDesc,
&insertLocDesc, nil, idleUPP);
exit: /* clean up */
DisposeDesc(&nullDesc);
DisposeDesc(&aerDesc);
DisposeDesc(&insertLocDesc);
DisposeDesc(&urlDesc);
DisposeDesc(&fspecDesc);
return osstat;
} // FetchGet()
/*
* FetchViewFile() --
* Tell Fetch to view a file (specified by a URL).
*/
OSErr FetchViewFile(char *url, AEIdleUPP idleUPP)
{
AEDesc urlDesc;
OSErr osstat = noErr;
InitDesc(&urlDesc);
osstat = CreateFormNameOSpec(url, cURL, nil, &urlDesc);
if (osstat == noErr)
osstat = SendDirectAppleEvent(FETCH_APP_SIGNATURE, kAEFetchSuite, kAEViewFileEvent,
&urlDesc, nil, idleUPP);
DisposeDesc(&urlDesc);
return osstat;
} // FetchViewFile()
/*
* FetchItemExists() --
* Ask Fetch whether a file (or directory) is included in the frontmost transfer window file list.
*/
OSErr FetchItemExists(char *fname, Boolean *exists, AEIdleUPP idleUPP)
{
AppleEvent aereply;
AEDesc fnameDesc;
AEDesc replyDesc;
OSErr osstat = noErr;
InitDesc(&aereply);
InitDesc(&fnameDesc);
InitDesc(&replyDesc);
osstat = CreateFormNameOSpec(fname, cHostItem, nil, &fnameDesc);
if (osstat != noErr)
goto exit;
osstat = SendDirectAppleEvent(FETCH_APP_SIGNATURE, kAECoreSuite, kAEDoObjectsExist,
&fnameDesc, &aereply, idleUPP);
if (osstat != noErr)
goto exit;
osstat = AEGetParamDesc(&aereply, keyAEResult, typeBoolean, &replyDesc);
if (osstat != noErr)
goto exit;
*exists = **replyDesc.dataHandle != 0;
exit:
DisposeDesc(&aereply);
DisposeDesc(&fnameDesc);
DisposeDesc(&replyDesc);
return osstat;
} // FetchItemExists()
/*
* FetchRenameItem() --
* Rename an item in the frontmost transfer window file list.
*/
OSErr FetchRenameItem(char *oldname, char *newname, AEIdleUPP idleUPP)
{
AEDesc itemDesc;
AEDesc propDesc;
AEDesc newnameDesc;
OSErr osstat = noErr;
InitDesc(&itemDesc);
InitDesc(&propDesc);
InitDesc(&newnameDesc);
/* create ospec for name of named item */
osstat = CreateFormNameOSpec(oldname, cHostItem, nil, &itemDesc);
if (osstat != noErr)
goto exit;
osstat = CreatePropertyOSpec(pName, &itemDesc, &propDesc);
if (osstat != noErr)
goto exit;
/* create desc for new name */
CStringToDesc(newname, typeChar, &newnameDesc);
/* send the event */
osstat = SendDirectAppleEventWithArg(FETCH_APP_SIGNATURE, kAECoreSuite, kAESetData,
&propDesc, keyAEData, &newnameDesc, nil, idleUPP);
if (osstat != noErr)
goto exit;
exit:
DisposeDesc(&itemDesc);
DisposeDesc(&propDesc);
DisposeDesc(&newnameDesc);
return osstat;
} // FetchRenameItem()
/*
* FetchCreateDirectory() --
* Tell Fetch to create a directory (in the frontmost transfer window).
*/
OSErr FetchCreateDirectory(char *dirname, AEIdleUPP idleUPP)
{
AEDesc nullDesc;
AEDesc aerDesc;
AEDesc insertLocDesc;
AEDesc propDesc;
DescType positionCode;
OSErr osstat;
InitDesc(&nullDesc);
InitDesc(&aerDesc);
InitDesc(&insertLocDesc);
InitDesc(&propDesc);
osstat = noErr;
/* first build insertion location ("Beginning of null container") */
/* NOTE: null container equals the front window in this case */
osstat = AECreateList(nil, 0, true, &aerDesc);
if (osstat != noErr)
goto exit;
/* add object-in-relation-to field */
osstat = AEPutKeyDesc(&aerDesc, keyAEObject, &nullDesc);
if (osstat != noErr)
goto exit;
/* add positioning field */
positionCode = kAEBeginning;
osstat = AEPutKeyPtr(&aerDesc, keyAEPosition, typeEnumerated, &positionCode,
sizeof(positionCode));
if (osstat != noErr)
goto exit;
/* coerce to typeInsertionLoc */
osstat = AECoerceDesc(&aerDesc, typeInsertionLoc, &insertLocDesc);
if (osstat != noErr)
goto exit;
/* build initial property data */
osstat = AECreateList(nil, 0, true, &propDesc);
if (osstat != noErr)
goto exit;
/* add dir name (can't create dir without it) */
osstat = AEPutKeyPtr(&propDesc, pName, typeChar, dirname, strlen(dirname));
if (osstat != noErr)
goto exit;
/* now send the event */
osstat = SendCreateAppleEvent(FETCH_APP_SIGNATURE, cHostDirectory,
&insertLocDesc, nil, &propDesc, nil, idleUPP);
exit: /* clean up */
DisposeDesc(&nullDesc);
DisposeDesc(&aerDesc);
DisposeDesc(&insertLocDesc);
DisposeDesc(&propDesc);
return osstat;
} // FetchCreateDirectory()
/*
* FetchSendCommand() --
* Tell Fetch to send a custom command (or CR-delimited list of commands)
* to a URL (i.e. connect to the URL, then send the commands).
*/
OSErr FetchSendCommand(char *cmd, char *url, AEIdleUPP idleUPP)
{
AEDesc urlDesc;
AEDesc cmdDesc;
OSErr osstat = noErr;
InitDesc(&urlDesc);
InitDesc(&cmdDesc);
osstat = CreateFormNameOSpec(url, cURL, nil, &urlDesc);
if (osstat != noErr)
goto exit;
CStringToDesc(cmd, typeChar, &cmdDesc);
osstat = SendDirectAppleEventWithArg(FETCH_APP_SIGNATURE, kAEFetchSuite, kAESendFTPCommandEvent,
&urlDesc,
kAEFetchSendFTPCommandsParam, &cmdDesc,
nil, idleUPP);
exit:
DisposeDesc(&urlDesc);
DisposeDesc(&cmdDesc);
return osstat;
} // FetchSendCommand()
/*
* FetchGetPreference() --
* Get an arbitrary Fetch preference.
*/
OSErr FetchGetPreference(DescType propCode, AEDesc *valueDesc, AEIdleUPP idleUPP)
{
AppleEvent aereply;
AEDesc nullDesc;
AEDesc propDesc;
OSErr osstat = noErr;
InitDesc(&aereply);
InitDesc(&nullDesc);
InitDesc(&propDesc);
/* create ospec for application object property (app object == null) */
osstat = CreatePropertyOSpec(propCode, &nullDesc, &propDesc);
if (osstat != noErr)
goto exit;
/* send the event */
osstat = SendDirectAppleEvent(FETCH_APP_SIGNATURE, kAECoreSuite, kAEGetData,
&propDesc, &aereply, idleUPP);
if (osstat != noErr)
goto exit;
osstat = AEGetParamDesc(&aereply, keyAEResult, typeWildCard, valueDesc);
if (osstat != noErr)
goto exit;
exit:
DisposeDesc(&aereply);
DisposeDesc(&nullDesc);
DisposeDesc(&propDesc);
return osstat;
} // FetchGetPreference()
/*
* FetchSetPreference() --
* Set an arbitrary Fetch preference.
*/
OSErr FetchSetPreference(DescType propCode, AEDesc *valueDesc, AEIdleUPP idleUPP)
{
AEDesc nullDesc;
AEDesc propDesc;
OSErr osstat = noErr;
InitDesc(&nullDesc);
InitDesc(&propDesc);
/* create ospec for application object property (app object == null) */
osstat = CreatePropertyOSpec(propCode, &nullDesc, &propDesc);
if (osstat != noErr)
goto exit;
/* send the event */
osstat = SendDirectAppleEventWithArg(FETCH_APP_SIGNATURE, kAECoreSuite, kAESetData,
&propDesc, keyAEData, valueDesc, nil, idleUPP);
if (osstat != noErr)
goto exit;
exit:
DisposeDesc(&nullDesc);
DisposeDesc(&propDesc);
return osstat;
} // FetchSetPreference()